﻿// 1104 NOI2010, 能量采集.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*
http://oj.daimayuan.top/course/22/problem/1181
栋栋有一块长方形的地，他在地上种了一种能量植物，这种植物可以采集太阳光的能量。
在这些植物采集能量后，栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起。

栋栋的植物种得非常整齐，一共有 n列，每列有 m棵，植物的横竖间距都一样，因此对于每一棵植物，
栋栋可以用一个坐标 (x,y)来表示，其中 x的范围是 1至 n，y的范围是 1至 m，表示是在第 x列的第 y棵。

由于能量汇集机器较大，不便移动，栋栋将它放在了一个角上，坐标正好是 (0,0)。

能量汇集机器在汇集的过程中有一定的能量损失。如果一棵植物与能量汇集机器连接而成的线段上有 k棵植物，则能量的损失为 2k+1。
例如，当能量汇集机器收集坐标为 (2,4)的植物时，由于连接线段上存在一棵植物 (1,2)，会产生 3的能量损失。
注意，如果一棵植物与能量汇集机器连接的线段上没有植物，则能量损失为 1。现在要计算总的能量损失。

输入格式
一行两个整数 n,m(1≤n,m≤105)。

输出格式
仅包含一个整数，表示总共产生的能量损失。

样例输入1
5 4
样例输出1
36
样例输入2
3 4
样例输出2
20
*/

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <stdio.h>


using namespace std;

typedef long long ll;

int n, m;
ll f[101000],ans;


int main()
{
	cin >> n >> m;
	if (n < m) swap(n, m);

	for (int i = n; i >= 1; i--) {
		f[i] = 1LL*(n / i) * (m / i);
		for (int j = i + i; j <= n; j += i) {
			f[i] -= f[j];
		}
		ans += i * f[i];
	}

	ans = ans * 2 - 1LL*n*m;
	cout << ans << endl;
	 
	return 0;
}

 